package com.cgq.controller;

import com.cgq.pojo.Course;
import com.cgq.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * *  Author:陈国强
 * *  Description:
 * *  Date:2023/2/13 22:37
 */
@RestController
@RequestMapping("/course")
public class CourseController {

    @Autowired
    private CourseService service;


    @RequestMapping("/courseList1")
    public List<Course> getCourseList(){
        //直接查询数据库   每次查询 都走数据库   每次都走数据库 性能低
        return service.findCourse();
    }


    //利用redis缓存进行查询
    @GetMapping("/courseRedisList")
    public List<Course> courseRedisList(){
        return service.findRedisCourse();
    }

    
    //利用stringRedis缓存进行查询
    @GetMapping("/courseStringRedisList")
    public List<Course> courseStringRedisList(){

        //会出现 缓存击穿的问题  使用 锁 synchronized  来解决
        return service.findStringRedisCourse();
    }

    //利用stringRedis缓存进行查询
    @GetMapping("/courseStringRedisList1")
    public List<Course> courseStringRedisList1(){

        //会出现 缓存击穿的问题  使用 锁 synchronized  来解决

        //但是  分布式锁的问题  在分布式场景下  本地锁 synchronized无法同时锁住多个进程下的线程

        return service.findStringRedisCourse1();
    }


    //演示利用redis中的setnx进行加锁缓存进行查询
    @GetMapping("/courseStringRedisList2")
    public List<Course> courseStringRedisList2(){

        //会出现 缓存击穿的问题  使用 锁 synchronized  来解决

        //但是  分布式锁的问题  在分布式场景下  本地锁 synchronized无法同时锁住多个进程下的线程

        return service.findStringRedisCourse2();
    }
}
